/**
 * @file demo_create_json_data.c
 * @author David Hu (hmd_hubei_cn@163.com)
 * @brief 使用CJSON库API创建json格式字符串并写入到文件
 * @version 0.1
 * @date 2022-12-24
 * 
 * Copyright (c) 2022 DAVID HU All rights reserved.
 * 
 * 编译方法: gcc demo_create_json_data.c cJSON.c
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"

int main(int argc, char const *argv[]) {
  // 定义三个json对象（链表节点）
  cJSON* test_json_obj = NULL;
  cJSON* test_json_obj_item_obj = NULL;
  cJSON* test_json_obj_item_array = NULL;
  char* json_str = NULL;

  // 创建
  // 1. json对象 根
  test_json_obj = cJSON_CreateObject();
  cJSON_AddStringToObject(test_json_obj, "name", "David Hu");
  cJSON_AddNumberToObject(test_json_obj, "age", 26);
  cJSON_AddNumberToObject(test_json_obj, "height", 178);
  cJSON_AddNumberToObject(test_json_obj, "weight", 80.0);
  
  // 2. json对象的一个键  其值为对象
  test_json_obj_item_obj = cJSON_CreateObject();
  cJSON_AddStringToObject(test_json_obj_item_obj, "country", "China");
  cJSON_AddNumberToObject(test_json_obj_item_obj, "code", 111111);
  cJSON_AddItemToObject(test_json_obj, "address", test_json_obj_item_obj);

  // 3. json对象的一个键 其值为数组
  test_json_obj_item_array = cJSON_CreateArray();
  cJSON_AddItemToArray(test_json_obj_item_array, cJSON_CreateString("C"));
  cJSON_AddItemToArray(test_json_obj_item_array, cJSON_CreateString("C++"));
  cJSON_AddItemToArray(test_json_obj_item_array, cJSON_CreateString("Python"));
  cJSON_AddItemToObject(test_json_obj, "skill", test_json_obj_item_array);

  cJSON_AddFalseToObject(test_json_obj, "student");

  // printf  标准格式json字符串
  json_str = cJSON_Print(test_json_obj);
  printf("%s\n", json_str);
  
  // 写入json数据到文件
  FILE* p_jsonfile = NULL;
  p_jsonfile = fopen("./test.json", "w");
  if (p_jsonfile == NULL) {
    printf("open json file fail.\n");
    cJSON_Delete(test_json_obj);
    free(json_str);
    return -1;
  }

  int ret = fputs(json_str, p_jsonfile);
  if (ret < 0) {
    printf("write json file fail.\n");
    cJSON_Delete(test_json_obj);
    free(json_str);
    return -1;
  }

  fclose(p_jsonfile);

  // 释放内存占用资源
  cJSON_Delete(test_json_obj);
  free(json_str);

  return 0;
}
